// src/apis/stockApi.js

/**
 * 本文件定义了与股票行情相关的所有前端 API 调用
 */

import http from '../utils/http';  // 你已有的 axios 实例，自动带 baseURL + token 拦截
import axios from 'axios';


export const $fetchStockHistory = async (symbol, days = 5) => {
  const res = await http.get('/api/stock/history', {
    params: { symbol, days }
  });
  // 后端返回 { code: 0, data: [...] }
  if (res.data.code !== 0) {
    throw new Error(res.data.msg || '获取历史行情失败');
  }
  return res.data.data;
};

/**
 * 获取个股静态信息
 * @param {string} symbol 'sh600000' | 'sz000001' | '000001'
 * @returns {Promise<[{item: string, value: any}]>}
 */
  export const $fetchStockInfo = async (symbol) => {
    try {
      // ① 用 axios 而不是 http，这样拿到完整的 response 对象
      const response = await axios.get('/api/stock/info', {
        params: { symbol }
      })
      // ② 这时 response.status、response.statusText 就正确可用了
      if (response.status !== 200) {
        throw new Error(`fetchStockInfo 网络错误：HTTP ${response.status} ${response.statusText}`)
      }
      // ③ 再拿业务数据
      const { code, data, msg } = response.data
      if (code !== 0) {
        throw new Error(`fetchStockInfo 业务错误：code=${code}, msg=${msg}`)
      }
      return data
      

  } catch (err) {
    // Axios 发出去但没收到响应
    if (err.request && !err.response) {
      throw new Error(
        `fetchStockInfo 无响应：symbol=${symbol}，请求信息=${JSON.stringify(err.request._currentRequest || err.request)}`
      )
    }

    // 收到了响应但状态码非 2xx
    if (err.response) {
      const { status, statusText, data: respData } = err.response
      throw new Error(
        `fetchStockInfo HTTP ${status} ${statusText}，symbol=${symbol}，返回数据=${JSON.stringify(respData)}`
      )
    }

    // 其它错误（例如拼写、超时等）
    throw new Error(`fetchStockInfo 异常：${err.message}`)
  }
}


/**
 * 获取全市场行情列表
 * 兼容后端返回字段或整体为字符串、处理 NaN
 */
export async function $fetchStockList() {
  const res = await axios.get('/api/stock/list')
  let body = res.data

  // 如果 backend 将整个 body 当字符串返回
  if (typeof body === 'string') {
    const cleaned = body.replace(/\bNaN\b/g, 'null')
    try {
      body = JSON.parse(cleaned)
    } catch (e) {
      throw new Error(`响应非 JSON 格式：${cleaned}`)
    }
  }

  // 如果 body.data 是字符串，也需要 parse
  if (body && typeof body === 'object' && typeof body.data === 'string') {
    const cleanedData = body.data.replace(/\bNaN\b/g, 'null')
    try {
      body.data = JSON.parse(cleanedData)
    } catch (e) {
      throw new Error(`data 字段非 JSON 格式：${cleanedData}`)
    }
  }

  // 兼容纯数组或 { code, data } 对象
  if (Array.isArray(body)) {
    return body
  }
  if (body && typeof body === 'object' && typeof body.code !== 'undefined') {
    if (body.code === 0 && Array.isArray(body.data)) {
      return body.data
    }
    throw new Error(`业务异常：code=${body.code}, msg=${body.msg || '无'}`)
  }

  throw new Error(`返回格式不符合预期：${JSON.stringify(body)}`)
}

/**
 * 获取个股实时行情并绘制分时图
 */
// 拉取并渲染
// src/api/stockApi.js

/**
 * 获取单只 A 股/指数的分时数据
 * @param {string} symbol 例如 'sh900901'
 * @param {string} period '1' | '5' | '15' | '30' | '60'
 * @returns {Promise<Array<{time:string,open:number,high:number,low:number,close:number,volume:number}>>}
 */

export async function $fetchAStockMinute({ symbol, period }) {
  console.log('请求参数:', { symbol, period }); // 打印参数
  
  const res = await axios.get('/api/stock/a_minute',{
    params: { symbol, period } // 确保参数正确传递
  }).then(res => res.data);

  
  let body = res; // 直接使用 axios 返回的 data
  console.log('响应数据:', body);
  console.log('响应数据内容:', body.data); // 打印响应的 data 部分
  
  
  // 如果 backend 将整个 body 当字符串返回
  if (typeof body === 'string') {
    const cleaned = body.replace(/\bNaN\b/g, 'null')
    try {
      body = JSON.parse(cleaned)
    } catch (e) {
      throw new Error(`响应非 JSON 格式：${cleaned}`)
    }
  }

  // 如果 body.data 是字符串，也需要 parse
  if (body && typeof body === 'object' && typeof body.data === 'string') {
    const cleanedData = body.data.replace(/\bNaN\b/g, 'null')
    try {
      body.data = JSON.parse(cleanedData)
    } catch (e) {
      throw new Error(`data 字段非 JSON 格式：${cleanedData}`)
    }
  }
  
 

  // 兼容纯数组或 { code, data } 对象
  if (Array.isArray(body)) {
    return body
  }
  if (body && typeof body === 'object' && typeof body.code !== 'undefined') {
    if (body.code === 0 && Array.isArray(body.data)) {
      return body.data
    }
    throw new Error(`业务异常：code=${body.code}, msg=${body.msg || '无'}`)
  }

  throw new Error(`返回格式不符合预期：${JSON.stringify(body)}`)
}



/**
 * 获取单只 A 股/指数的分时数据
 * @param {string} symbol 例如 'sh900901'
 * @param {string} period '1' | '5' | '15' | '30' | '60'
 * @returns {Promise<Array<{time:string,open:number,high:number,low:number,close:number,volume:number}>>}
 */

export async function $fetchStockKline({ symbol, period }) {
  console.log('请求参数:', { symbol, period }); // 打印参数
  
  const res = await axios.get('/api/stock/kline',{
    params: { symbol:'sh900901', period:'1' } // 确保参数正确传递
  }).then(res => res.data);

  
  let body = res; // 直接使用 axios 返回的 data
  console.log('响应数据:', body);
  console.log('响应数据内容:', body.data); // 打印响应的 data 部分
  
  
  // 如果 backend 将整个 body 当字符串返回
  if (typeof body === 'string') {
    const cleaned = body.replace(/\bNaN\b/g, 'null')
    try {
      body = JSON.parse(cleaned)
    } catch (e) {
      throw new Error(`响应非 JSON 格式：${cleaned}`)
    }
  }

  // 如果 body.data 是字符串，也需要 parse
  if (body && typeof body === 'object' && typeof body.data === 'string') {
    const cleanedData = body.data.replace(/\bNaN\b/g, 'null')
    try {
      body.data = JSON.parse(cleanedData)
    } catch (e) {
      throw new Error(`data 字段非 JSON 格式：${cleanedData}`)
    }
  }
  
 

  // 兼容纯数组或 { code, data } 对象
  if (Array.isArray(body)) {
    return body
  }
  if (body && typeof body === 'object' && typeof body.code !== 'undefined') {
    if (body.code === 0 && Array.isArray(body.data)) {
      return body.data
    }
    throw new Error(`业务异常：code=${body.code}, msg=${body.msg || '无'}`)
  }

  throw new Error(`返回格式不符合预期：${JSON.stringify(body)}`)
}

   

/**
 * 购买股票
 * @param {Object} data - 购买数据
 * @returns {Promise<Object>}
 */
export const $buyStock = async (data) => {
  try {
      const response = await axios.post('/api/stock/buy', data, {
        headers: {
            'Content-Type': 'application/json; charset=utf-8'
        }
    });
      return response.data;
  } catch (error) {
      throw error.response?.data || { msg: '购买失败' };
  }
};

/**
* 卖出股票
* @param {Object} data - 卖出数据
* @returns {Promise<Object>}
*/
export const $sellStock = async (data) => {
  try {
      const response = await axios.post('/api/stock/sell', data);
      return response.data;
  } catch (error) {
      throw error.response?.data || { msg: '卖出失败' };
  }
};